Amazon S3バケットを同期する際の検討ポイントをまとめてみた
AWSのオブジェクトストレージS3は
- コンプライアンス
- 事業継続性
- レイテンシーの改善
- データのリージョン集約
などのために別のS3バケットに同期することがあります。
S3のマネージド機能を使い、リージョン間で同期する機会があったので、検討ポイントを簡単に整理します。
同期方法
同期方法は主に次の3種類があります。
手法 | 同期タイミング | 対象オブジェクト | 工数 |
---|---|---|---|
S3 Replication | ライブ | 新規 | 小 |
S3 Batch Replication | オンデマンド | 既存 | 小 |
独自 | 任意 | 任意 | 大 |
S3 Replication
S3 Replication機能はS3 マネージドのライブ・レプリケーション機能です。
設定後に更新されたオブジェクトが同期対象であり、既存オブジェクトは同期対象外です。
レプリケート先は
- アカウント(同一・別)
- リージョン(同一・別)
- ストレージクラス(同一・別)
など柔軟に設定可能です。
複雑な要件のために、複数の同期先や双方向の同期にも対応しています。
レプリカは作成日時を含む全てのメタデータが引き継がれます。
どういう状態のオブジェクトが同期されるのか、ドキュメントを熟読しましょう。 バージョニングやライフサイクルが絡むため、ややこしいです。
大部分のオブジェクトは15分以内にレプリケートされますが、数時間かかることもあります。 S3 Replication Time Control (S3 RTC)機能を併用すると、99.99%のオブジェクトを15分以内にレプリケートします。 同期のリアルタイム性が求められる場合は、S3 RTCを有効にしましょう。
やってみた
S3 Batch Replication
S3 Batch ReplicationはS3 マネージドのオンデマンドのレプリケーション機能です。
既存オブジェクトが同期対象です。
S3 Batch Operations機能を利用して実現されており、上記S3 Replication機能の設定を元に同期します。
既存バケット全体を新規に同期する際に、既存オブジェクトはS3 Batch Replicationで同期し、新規オブジェクトは S3 Replicationで同期というように、シームレスに併用することもできます。
ライブレプリケーションが一部失敗したときのリカバリにも使えます。
S3 Batch Replicationのオンデマンドな特性から、S3 RTC機能は併用できません。
やってみた
独自
マネージド機能を使わず、独自に実装することも可能です。
ナイーブに $ aws s3 sync
コマンドでバケット間で同期したり、S3バケットへのオブジェクト単位のイベントをトリガーにリアルタイムに同期することも可能です。
前処理を挟めるなど、自由度が高い一方で、実装・運用工数も増えます。
やってみた
- AWSアカウント間のS3, DynamoDBデータ移行計画の記録 (背景と転送方法の検討) | DevelopersIO
- AWSアカウント間のS3, DynamoDBデータ移行計画の記録(データ完全性検証方法の検討) | DevelopersIO
使い分け
- 同期ロジックが必要 → 独自実装
- 既存オブジェクトの同期 → S3 Batch Replication
- 継続的同期 → S3 Replication
が大方針です。
既存オブジェクトも含めたバケット全体を継続的にニアリアルタイムに同期したい場合
- S3 Replication
- S3 Batch Replication
- S3 RTC
の3機能を併用します。
同期料金
- S3 Replication
- S3 Batch Replication
- S3 RTC
の3機能を利用し、東京からバージニア北部にリージョン間レプリケーション(CRR)した場合の概算コストを求めます。
主要な明細だけ列挙します。
内容 | サービス | Type例 | Description例 | 適用レートのリージョン |
---|---|---|---|---|
CRRデータ転送 | Data Transfer | APN1-USE1-AWS-Out-Bytes | $0.09 per GB - Asia Pacific (Tokyo) data transfer to US East (Northern Virginia) | 同期先 |
S3RTC用データ転送量 | S3 | APN1-USE1-S3RTC-Out-Bytes | $0.015 per GB - Asia Pacific (Tokyo) Data Transfer for Replication Time Control to US East (N. Virginia) | 全リージョン共通 |
ジョブ実行 | S3 | APN1-BatchOperations-Jobs | $0.25 per job fee for Batch Operations | 同期元 |
ジブ実行対象オブジェクト | S3 | APN1-BatchOperations-Manifest | $0.015 per 1 million objects in source bucket | 同期元 |
ストレージ | S3 | APN1-TimedStorage-ByteHrs | $0.025 per GB - first 50 TB / month of storage used | 同期元/先 |
同一リージョンのバケットに同期する場合、「CRRデータ転送」の費用は発生しません。
概算としては
- ストレージ
- データ転送
の大きな数字をまず抑え、PoCなどでより精緻に算出しましょう。
例えば、毎月100GBのデータが発生し、別リージョンにレプリケートすると
- 2バケット合わせて毎月増えるストレージコストは $0.25/GB * 100GB * 2(バケット) = $10.0
- 毎月かかるデータ転送コストは (0.09+0.015) * 100GB = $10.5
となります。
AWSリソース設定
構成例
設定時の注意事項は次の通りです。
S3 Replication
レプリケーションの要件を熟読しましょう。
見過ごしがちな必須要件として、同期元と同期先の両方のS3バケットに対してバージョニングを有効化します。
さらに、どういうオブジェクトがレプリケートされるのか、把握しましょう。
3つのバケットを A→B→Cというように多段レプリケートできません。レプリケートされたオブジェクト(レプリカ)はレプリケーション対象外です。
同期の遅延監視
マネージド機能を利用してS3バケット間レプリケーションを利用すると、遅延状況の監視と遅延オブジェクトの通知が可能です。
CloudWatch Metricsで監視
S3バケット間の同期遅延状況は同期先リージョンのCloudWatch Metricsで監視できます。
Replicationネームスペースに以下のメトリクスが出力されます。
Bytes Pending Replication
: レプリケーションを保留しているオブジェクトの合計バイト数。Replication Latency
: レプリケーションの遅延秒数Operations Pending Replication
: レプリケーションを保留している操作の数。
S3 RTCを有効にすると、これらメトリクスは自動的に有効化されます。 S3 RTCを利用しない場合も、有効にしましょう。
参考
- Monitoring progress with replication metrics and Amazon S3 event notifications - Amazon Simple Storage Service
- Viewing replication metrics using the Amazon S3 console - Amazon Simple Storage Service
S3イベントで監視
同期元のS3バケットに対してSNSなどと連携をしてイベント通知設定しておくと、レプリケーション障害時に
s3:Replication:OperationFailedReplication
(同期失敗)
といったイベントが通知されます。
{ "Records": [ { "eventVersion": "2.2", "eventSource": "aws:s3", "awsRegion": "ap-northeast-1", "eventTime": "2023-01-25T10:48:22.076Z", "eventName": "Replication:OperationFailedReplication", "userIdentity": { "principalId": "s3.amazonaws.com" }, "requestParameters": { "sourceIPAddress": "s3.amazonaws.com" }, "responseElements": { "x-amz-request-id": "08ba-...-fc7924841830", "x-amz-id-2": "VzT80+...==" }, "s3": { "s3SchemaVersion": "1.0", "configurationId": "test", "bucket": { "name": "YOUR-SOURCE-BUCKET-NAME", "ownerIdentity": { "principalId": "123456789012" }, "arn": "arn:aws:s3:::YOUR-SOURCE-BUCKET-NAME" }, "object": { "key": "test/1.jpg", "size": 2583, "eTag": "3f2d220c530bf589efbc26e984865274", "versionId": "4oLoYhaCKMxWCybU7hcMIn4TSs2PC9rc", "sequencer": "0063D108DC7414565B" } }, "replicationEventData": { "replicationRuleId": "YOUR-DEST-BUCKET-NAME", "destinationBucket": "arn:aws:s3:::YOUR-DEST-BUCKET-NAME", "s3Operation": "OBJECT_PUT", "requestTime": "2023-01-25T10:48:21.423Z", "failureReason": "DstBucketUnversioned" } } ] }
特に、S3 RTCを有効にすると、99.99%の同期閾値である15分に対して、以下のイベントが通知されます。
OperationMissedThreshold
(オブジェクトが15分間の閾値を超えても同期されていない)OperationReplicatedAfterThreshold
(オブジェクトが15分間の閾値を超えて同期された)
※ AWS re:Invent 2022 - Best practices for Amazon S3 replication, featuring HBO Max (STG336) から
参考
- Enabling and configuring event notifications using the Amazon S3 console - Amazon Simple Storage Service
- Walkthrough: Configuring a bucket for notifications (SNS topic or SQS queue) - Amazon Simple Storage Service
- Amazon S3 replication failure reasons - Amazon Simple Storage Service
まとめ
Amazon S3のマネージド機能を積極的に活用し、S3バケットをレプリケートする方法を紹介しました。
新規オブジェクトをレプリケートしたい場合、S3 Replication機能を検討しましょう。同期のリアルタイム性が必要な場合は S3 Replication Time Control (S3 RTC)機能も併用しましょう。
既存オブジェクトの同期が必要な場合は、S3 Batch Replicationを検討しましょう。S3 Replicationの設定を流用できるため、シームレスに利用できます。
レプリケーションの遅延・失敗に備え、CloudWatch Metricsの監視やS3のレプリケーションイベントの通知も怠らないようにしましょう。
上記で実現できない場合は、何らかの作り込みを伴う可能性が高いです。
それでは。